package GUI.pdaGrafica;

import javax.swing.JPanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JWindow;
import java.awt.Dimension;
import javax.swing.BorderFactory;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import java.awt.Font;
import java.awt.Color;

import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.border.BevelBorder;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableModel;

import java.awt.Point;
import javax.swing.JButton;
import java.awt.event.KeyEvent;
import java.util.List;
import java.util.ListIterator;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

import modelo.Restaurante;
import modelo.gestionPedidos.Consumicion;
import modelo.gestionPedidos.Pedido;
import modelo.gestionReserva.Mesa;

import javax.swing.ListSelectionModel;


/**
 * Esta clase implementa la sección para la gestión de pedidos
 * 
 * @created 04-may-2007 11:47
 * @version 1.0
 * @author Enrique Menor Santos
 *
 */
public class EditarConsumiciones extends JWindow implements ActionListener,ListSelectionListener {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JScrollPane jSPEditarConsumiciones = null;

	private JTable jTConsumicionesActuales = null;
	
	private DefaultTableModel tablaModelo=null;  //  @jve:decl-index=0:visual-constraint="261,16"

	private JButton jBNuevo = null;

	private JButton jBEditar = null;

	private JButton jBEliminar = null;

	private JButton jBVolver = null;

	private JButton jBAviso = null;

	private JLabel jLPedido = null;
	
	/**
	 * Objeto restaurante a gestionar. Se pasará como parámetro al resto de clases visuales. 
	 */
	private Restaurante r=null;
	/**
	 * Pedido a editar
	 */
	private Pedido pedido=null;
	/**
	 * Este atributo almacena una cadena con el formato <mesas del pedido>(num Comensales)
	 */
	private String nombrePedido=null;
	/**
	 * 
	 */
	private List<Consumicion> listaConsumiciones=null;
	/**
	 * Referencia a la consumicion seleccionada en cada momento
	 */
	Consumicion consumicionSeleccionada=null;

	/**
	 * Constructor con dos parámetros
	 * @param r: objeto Restaurante
	 * @param pedidoSeleccionado: pedido que va a editarse
	 */
	public EditarConsumiciones(Restaurante r, Pedido pedidoSeleccionado)
	{
		this.r=r;
		this.pedido=pedidoSeleccionado;
		this.nombrePedido=crearNombrePedido();
		this.pedido.recuperarPedido();				//actualizamos el pedido que se pasa como parámetro con los datos de la BD
		this.listaConsumiciones=this.pedido.getConsumiciones();
		initialize();		
	}
	/**
	 * Método privado que obtiene el nombre del pedido
	 *
	 */
	private String crearNombrePedido() 
	{
		String s = "Mesas: ";
		if (this.pedido != null)
		{
			List<Mesa> lm = this.pedido.getMesas();
			
			if (lm!=null)
			{
				//recorremos la lista de mesas asociadas al pedido incluyendo su numeor de mesa
				ListIterator<Mesa> itm= lm.listIterator();
				while(itm.hasNext())
					s=s+(itm.next().getNumMesa())+",";
			}
			//finalmente incluimos el numero de comensales
			s=s+"("+ this.pedido.getNumComensales()+" comensales)";		
		}
		return s;					
	}
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(240, 320);
		this.setName("editarConsumiciones");
		this.setPreferredSize(new Dimension(240, 320));
		this.setMaximumSize(new Dimension(240, 320));
		this.setContentPane(getJContentPane());
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jLPedido = new JLabel();
			jLPedido.setText("Pedido: "+this.nombrePedido );
			jLPedido.setLocation(new Point(15, 25));
			jLPedido.setSize(new Dimension(219, 16));
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			jContentPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "EDITAR CONSUMICIONES", TitledBorder.CENTER, TitledBorder.ABOVE_TOP, new Font("Dialog", Font.BOLD, 12), new Color(51, 51, 51)));
			jContentPane.setName("panelEditarConsumiciones");
			jContentPane.setToolTipText("Seleccione alguna de las opciones relacionadas con las consumiciones del pedido");
			jContentPane.add(jLPedido, null);
			jContentPane.add(getJSPEditarConsumiciones(), null);
			jContentPane.add(getJBNuevo(), null);
			jContentPane.add(getJBEditar(), null);
			jContentPane.add(getJBEliminar(), null);
			jContentPane.add(getJBVolver(), null);
			jContentPane.add(getJBAviso(), null);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jSPEditarConsumiciones	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJSPEditarConsumiciones() {
		if (jSPEditarConsumiciones == null) {
			jSPEditarConsumiciones = new JScrollPane();
			jSPEditarConsumiciones.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
			jSPEditarConsumiciones.setLocation(new Point(5, 42));
			jSPEditarConsumiciones.setSize(new Dimension(230, 167));
			jSPEditarConsumiciones.setViewportBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
			jSPEditarConsumiciones.setToolTipText("Consumiciones asociadas al pedido");
			jSPEditarConsumiciones.setViewportView(getJTConsumicionesActuales());
		}
		return jSPEditarConsumiciones;
	}

	/**
	 * This method initializes jTConsumicionesActuales	
	 * 	
	 * @return javax.swing.JTable	
	 */
	private JTable getJTConsumicionesActuales() {
		if (jTConsumicionesActuales == null)
		{	
			//Despues no creamos el modelo de la tabla
			this.creaTablaModelo();
			//Finalmente nos creamos la tabla pasandole ambos modelos
			jTConsumicionesActuales=new JTable(tablaModelo);		
			
			jTConsumicionesActuales.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
			jTConsumicionesActuales.setToolTipText("Seleccione la mesa a editar");
			jTConsumicionesActuales.setAutoCreateColumnsFromModel(false);
			jTConsumicionesActuales.setCellSelectionEnabled(false);
			jTConsumicionesActuales.setShowGrid(true);
			jTConsumicionesActuales.setRowSelectionAllowed(true);
			jTConsumicionesActuales.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
			jTConsumicionesActuales.setShowHorizontalLines(true);
			
			jTConsumicionesActuales.getColumnModel().getColumn(0).setPreferredWidth(30);
			jTConsumicionesActuales.getColumnModel().getColumn(1).setPreferredWidth(80);
			jTConsumicionesActuales.getColumnModel().getColumn(2).setPreferredWidth(60);
			jTConsumicionesActuales.getColumnModel().getColumn(3).setPreferredWidth(100);
			
			jTConsumicionesActuales.getSelectionModel().addListSelectionListener(this);
			
			
		}
		return jTConsumicionesActuales;
	}
	/**
	 * Método interno que me crea la tabla modelo
	 *
	 */
	private void creaTablaModelo() 
	{
		tablaModelo=new DefaultTableModel();
		
		tablaModelo.addColumn("Silla");
		tablaModelo.addColumn("Consumición");
		tablaModelo.addColumn("Estado");
		tablaModelo.addColumn("Observaciones");	
				
		if(this.listaConsumiciones!=null)
		{
			//recorremos la lista de Consumiciones y vamos añadiendo sus campos a la tabla
			ListIterator<Consumicion> it = this.listaConsumiciones.listIterator();
			while(it.hasNext())
			{
				Consumicion c = it.next();
				int numCom=c.getNumComensal();
				String p = c.getProducto().consultarNombreProducto();
				String obs = c.getObservaciones();
				String estado="";
				switch(c.getEstado())
				{
					case(0):estado="ninguno";break;
					case(1):estado="solicitado";break;
					case(2):estado="en preparacion";break;
					case(3):estado="listo";break;
					case(4):estado="servido";break;
					case(5):estado="retrasado";break;
				}
				Object[] row={numCom,p,estado,obs};
				tablaModelo.addRow(row);
			}
		}
		else
			System.err.println("ERROR al obtener la lista de consumiciones del Pedido");		
		
	}
	/**
	 * This method initializes jBNuevo	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBNuevo() {
		if (jBNuevo == null) {
			jBNuevo = new JButton();
			jBNuevo.setPreferredSize(new Dimension(90, 25));
			jBNuevo.setToolTipText("Click para crear nuevo pedido");
			jBNuevo.setMnemonic(KeyEvent.VK_N);
			jBNuevo.setActionCommand("Nuevo");
			jBNuevo.setIcon(new ImageIcon(getClass().getResource("/iconos/table.png")));
			jBNuevo.setText("Nueva");
			jBNuevo.setLocation(new Point(10, 215));
			jBNuevo.setSize(new Dimension(105, 25));
			jBNuevo.setName("nuevo");
			jBNuevo.addActionListener(this);
		}
		return jBNuevo;
	}

	/**
	 * This method initializes jBEditar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBEditar() {
		if (jBEditar == null) {
			jBEditar = new JButton();
			jBEditar.setPreferredSize(new Dimension(90, 25));
			jBEditar.setToolTipText("Click para editar las consumiciones del pedido");
			jBEditar.setMnemonic(KeyEvent.VK_E);
			jBEditar.setActionCommand("Editar");
			jBEditar.setIcon(new ImageIcon(getClass().getResource("/iconos/table_edit.png")));
			jBEditar.setText("Editar");
			jBEditar.setLocation(new Point(10, 250));
			jBEditar.setSize(new Dimension(105, 25));
			jBEditar.setEnabled(false);
			jBEditar.setName("Editar");
			jBEditar.addActionListener(this);
		}
		return jBEditar;
	}

	/**
	 * This method initializes jBEliminar	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBEliminar() {
		if (jBEliminar == null) {
			jBEliminar = new JButton();
			jBEliminar.setToolTipText("Click para eliminar un pedido");
			jBEliminar.setMnemonic(KeyEvent.VK_M);
			jBEliminar.setActionCommand("Eliminar");
			jBEliminar.setIcon(new ImageIcon(getClass().getResource("/iconos/table_delete.png")));
			jBEliminar.setText("Eliminar");
			jBEliminar.setLocation(new Point(10, 285));
			jBEliminar.setSize(new Dimension(105, 25));
			jBEliminar.setEnabled(false);
			jBEliminar.setName("eliminar");
			jBEliminar.addActionListener(this);
		}
		return jBEliminar;
	}

	/**
	 * This method initializes jBVolver	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBVolver() {
		if (jBVolver == null) {
			jBVolver = new JButton();
			jBVolver.setToolTipText("Click para volver al menú principal");
			jBVolver.setMnemonic(KeyEvent.VK_V);
			jBVolver.setActionCommand("Volver");
			jBVolver.setIcon(new ImageIcon(getClass().getResource("/iconos/arrow_undo.png")));
			jBVolver.setText("Volver");
			jBVolver.setLocation(new Point(125, 250));
			jBVolver.setSize(new Dimension(105, 60));
			jBVolver.setName("servir");
			jBVolver.addActionListener(this);
		}
		return jBVolver;
	}

	/**
	 * This method initializes jBAviso	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJBAviso() {
		if (jBAviso == null) {
			jBAviso = new JButton();
			jBAviso.setIcon(new ImageIcon(getClass().getResource("/iconos/information.png")));
			jBAviso.setText("Solicitar");
			jBAviso.setLocation(new Point(125, 215));
			jBAviso.setSize(new Dimension(105, 25));
			jBAviso.setMnemonic(KeyEvent.VK_S);
			jBAviso.setName("solicitar");
			jBAviso.setPressedIcon(new ImageIcon(getClass().getResource("/iconos/exclamation.png")));
			jBAviso.setToolTipText("Click para solicitar un plato retrasado");
			jBAviso.setEnabled(false);
			jBAviso.setActionCommand("Aviso");
			jBAviso.addActionListener(this);
		}
		return jBAviso;
	}
	
	/**
	 * GESTION DE EVENTOOOOOOOOOOOOOOOOOOOOOOOOOOS 
	 */
	
	/**
	 *  Gestion de los botones
	 */	
	public void actionPerformed(ActionEvent e) {
		
		if (e.getActionCommand().equals("Volver"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new Pedidos(r).setVisible(true);			
		}	
		else if (e.getActionCommand().equals("Nuevo"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new CrearEditarConsumiciones(r,pedido,null).setVisible(true);			
		}	
		else if ( e.getActionCommand().equals("Editar"))
		{
			this.dispose();	//esconde la ventana y se deshace de ella
			new CrearEditarConsumiciones(r,pedido,consumicionSeleccionada).setVisible(true);			
		}	
		else if (e.getActionCommand().equals("Eliminar"))
		{
			int respuesta;
			respuesta = JOptionPane.showConfirmDialog(
					this, 
					"¿Está seguro de que desea eliminar la consumición '"+consumicionSeleccionada.getProducto().consultarNombreProducto()+"' del comensal '"+ consumicionSeleccionada.getNumComensal()+"'?",
					"Confirmar eliminación de la consumición",
					JOptionPane.YES_NO_OPTION,
					JOptionPane.QUESTION_MESSAGE
					);			
			if(respuesta==JOptionPane.YES_OPTION)
			{
				//intentamos eliminar la consumicion de la BD
				if (this.pedido.eliminarConsumicion(this.consumicionSeleccionada))
				{
					//actualizamos la lista de pedidos
					this.listaConsumiciones = pedido.getConsumiciones();
					//actualizamos la lista de pedidos del modelo grafic
					tablaModelo.removeRow(this.jTConsumicionesActuales.getSelectedRow());
				}
				else	//la consumicion no ha podido ser eliminado
				{
					JOptionPane.showMessageDialog(
							this,
							"La consumición '"+consumicionSeleccionada.getProducto().consultarNombreProducto()+"' del comensal '"+ consumicionSeleccionada.getNumComensal()+"' no ha podido ser eliminada.",
							"ERROR al eliminar consumición",
							JOptionPane.ERROR_MESSAGE);
				}				
			}
		}
		else if ( e.getActionCommand().equals("Aviso"))
		{
			this.pedido.solicitarPlatoRetrasado(this.consumicionSeleccionada);	
			this.tablaModelo.removeRow(this.getJTConsumicionesActuales().getSelectedRow());
			
			Object[] o ={
			consumicionSeleccionada.getNumComensal(),
			consumicionSeleccionada.getProducto().consultarNombreProducto(),
			"solicitado",
			consumicionSeleccionada.getObservaciones()
			};
			
			tablaModelo.addRow(o);
		}

	}
	/**
	 * Gestion de eventos de selecion de la lista de valores de la tabla
	 * 
	 */
	public void valueChanged(ListSelectionEvent e)
	{
		int fila = this.getJTConsumicionesActuales().getSelectedRow();
		
		//si hay seleccionada alguna fila
		if(fila>=0)
		{
			this.consumicionSeleccionada = this.listaConsumiciones.get(fila);
			
			if(consumicionSeleccionada!=null)
			{
				int estado = consumicionSeleccionada.getEstado();
				
				switch (estado)
				{
				case Consumicion.NINGUNO: 
					this.getJBEditar().setEnabled(false);
					this.getJBEliminar().setEnabled(false);
					this.getJBAviso().setEnabled(false);
					break;
				case Consumicion.SOLICITADO:
					this.getJBEditar().setEnabled(true);
					this.getJBEliminar().setEnabled(true);
					this.getJBAviso().setEnabled(false);
					break;
				case Consumicion.RETRASADO:
					this.getJBEditar().setEnabled(true);
					this.getJBEliminar().setEnabled(true);
					this.getJBAviso().setEnabled(true);
					break;
				case Consumicion.EN_PREPARACION:					
				case Consumicion.LISTO:					
				case Consumicion.SERVIDO:
					this.getJBEditar().setEnabled(false);
					this.getJBEliminar().setEnabled(false);
					this.getJBAviso().setEnabled(false);
					break;
					
				}
			}			
		}
		//ninguna fila seleccionada
		else
		{
			this.getJBEditar().setEnabled(false);
			this.getJBEliminar().setEnabled(false);
			this.getJBAviso().setEnabled(false);
		}
		
	}
		
}
